#include "Transferencia.h"
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>



void ReadToEndOfScreen(char* key);
int isQuit(char *command[8], CONEXION* pConexion);

int ParseAndSendData(CONEXION* pConexion)
{
	int commandIndex = 0;
	int dataIndex = 0;
	int i = 0;
	int type = -10;
	int isFirstWord = 0;
	char key;
	char lastKey;
	char command[8];
	char data[500];
	int cantItems = 0;
	int isUniquePunctuation = 0;
	char auxData[100];
	char auxData2[100];
	int auxInt;
	int auxDataIndex = 0;


	do
	{		
		scanf("%c", &key);
		
		// si es la primer palabra obtengo el comando y me fijo que no se muy larga la palabra para ya tirar error
		if ((isFirstWord == 0) && (commandIndex < 8))
		{	
			key = toupper(key);
			command[commandIndex] = key;		
			commandIndex ++;

			if (key == 32)
			{
				isFirstWord =1;

				command[commandIndex -1] = '\0';
					
				if (strcmp(command, "INT")==0)
					type = 0;

				if (strcmp(command, "STRING")==0)
					type = 1;

				if (strcmp(command, "FLOAT")==0)
					type = 2;
				
				if (strcmp(command, "DOUBLE")==0)
					type = 3;

				if (isQuit(command, pConexion) == RES_QUIT)
					return RES_QUIT;

				if (type == -10)
				{	
					ReadToEndOfScreen(&key);
					printf("Comando no valido\n");
					return RES_NOT_VALID_COMMAND;
				}			
			
			}
		}
		//aca es para obtener los datos a enviar
		else
		{
			//si el comando es largo es porque es un error (como mucho dice STRING)
			if (commandIndex >= 8)
			{
				ReadToEndOfScreen(&key);
				printf("Comando no valido\n");
				return RES_NOT_VALID_COMMAND;			
			}
			else
			{
				//espacio = 32 , enter = 10
				if ((key != 32) && (key != 10))
				{						
					//valido que si envian int sea solo int y si es double sea solo double
					if (((type == 0) && ((isdigit(key) == 0))  && (key !='-') || 
						((type == 3) && (isdigit(key) == 0) && (key !='-') && (key != ',') && (key != '.'))  ||
						(type == 3) && (key !='-') && ((key == ',') || (key == '.')) && (isUniquePunctuation == 1) ||
						((type == 2) && (key !='-') && (isdigit(key) == 0) && (key != ',') && (key != '.'))  ||
						(type == 2) && (key !='-') && ((key == ',') || (key == '.')) && (isUniquePunctuation == 1)) || 
						((type != 1) && (key == '-') && (auxDataIndex !=0)))
						
					{
						printf("Datos no validos\n");
						ReadToEndOfScreen(&key);
						return RES_NOT_VALID_DATA;
					}
					else
					{												
						//dejo que solo se ponga un punto o una coma
						if (((type == 3) && ((key == ',') || (key == '.'))) || ((type == 2) && ((key == ',') || (key == '.'))))		{
							isUniquePunctuation = 1;
						}

						auxData[auxDataIndex] = key;
					}
				}
				//hubo un espacio o un enter
				else
				{

					//que no manden dos espacios juntos si es int o double
					if ((lastKey == key) && (type != 1))
					{
						printf("Solo se acepta un espacio entre parametros del tipo INT,DOUBLE o FLOAT\n");
						ReadToEndOfScreen(&key);
						return RES_NOT_VALID_DATA;
					}					
					
					if (type == 0){
						auxData[auxDataIndex] = '\0';
						auxInt = atoi(auxData);
						itoa(auxInt, auxData2, 10);
					
						auxData2[auxDataIndex] = '\0';
						if (strcmp(auxData, auxData2)!=0){
								printf("Dato no valido.\n");
								ReadToEndOfScreen(&key);
								return RES_NOT_VALID_DATA;
						}
					}
				
					auxDataIndex = -1;
					auxData[0] = '\0';
					cantItems++;
					isUniquePunctuation = 0;
				}
				
				lastKey = key;
				//si es un enter pongo un '\0'para cerrar el string
				if(key==10)
					data[dataIndex] = '\0';
				else
					data[dataIndex] = key;
				dataIndex++;
				auxDataIndex++;
			}
		}
		
		//si llega a 500 el array mando estos primeros 500 datos y luego vuelvo a empezar a obtener mas datos
		if (dataIndex == 500)
		{
			data[500]='\0';
			//todavia tengo un solo item que supera los 500 bytes
			trEnviar(pConexion, type, 0, &data);
			
			for (i=0;i<500;i++)
			{
				data[i] = "";
			}
			dataIndex = 0;
			auxDataIndex = 0;
		}


	}while(key!=10);

	if ((command[4] == 10) || (command[4] == 32))
	     command[4] = '\0';

	if (trConexionActiva(pConexion)!= 0)
	{
		if (strcmp(command, "QUIT")==0)
		{
			return RES_QUIT;
		}
		else{
			_endthread();
		}

	}

	if (strcmp(command, "QUIT")==0)
	{
		trEnviar(pConexion, 1, 1, &command);		

		//if (trCerrarConexion(pConexion) ==0)
		//{
			return RES_QUIT;
		//}
		//else
		//{		
		//	return RES_ERROR_CLOSE_CONNECT;
		//}
	}

	//manda los datos
	if (isFirstWord == 1)
	{
		data[dataIndex] = '\0';
		if(type==1)cantItems=1;
		trEnviar(pConexion, type, cantItems, &data);
	}
	else
	{
		printf("Comando no valido\n");
	}
	return RES_OK;
}

//termina de leer todos los caracteres de la pantalla cuando ocurrio un error
void ReadToEndOfScreen(char* key)
{
		
	while (*key != 10)
	{
		scanf("%c", key);
	}
}

//si el comando es quit cierro la aplicacion
int isQuit(char *command[8], CONEXION* pConexion)
{
	//-1 to replace enter or space with string closure
	if ((command[4] == 10) || (command[4] == 32))
	   command[4] = '\0';

	if (strcmp(command, "QUIT")==0)
	{
		trEnviar(pConexion, 1, 1, command);
		return RES_QUIT;
		/*if (trCerrarConexion(pConexion) ==0)
		{
			return RES_QUIT;
		}
		else
		{		
			return RES_ERROR_CLOSE_CONNECT;
		}*/
	}
	/*else
	{
		return RES_OK;
	}*/
	else return RES_OK;
}

